package org.lestr.secuel.noyau.systemeLogique.conditions;

import java.util.ArrayList;
import java.util.Collection;

import org.lestr.secuel.noyau.systemeLogique.Condition;
import org.lestr.secuel.noyau.systemeLogique.ConditionEcouteur;
import org.lestr.secuel.noyau.systemeLogique.SystemeLogique;


public abstract class ConditionAbstraite implements Condition {

	
	// Déclaration de constantes
	private static final long serialVersionUID = 1L;

	
	// Déclaration des attributs
	private Collection<ConditionEcouteur> écouteurs;
	private boolean vraie;
	private SystemeLogique systèmeLogique;
	private String nom;
	private String typeNom;
	
	
	/** Constructeur */
	public ConditionAbstraite(){
		
		// Instanciation des attributs
		écouteurs = new ArrayList<ConditionEcouteur>();
		vraie = false;
		nom = "Nouvelle Condition";
		typeNom = "Condition Type";
		
	}// FIN Constructeur
	
	
	/** Défini le nom du type de la condition */
	protected void setTypeNom(String typeNom){
		
		this.typeNom = typeNom;
		
	}// FIN retTypeNom
	
	
	/** Retourne le nom du type de la condition */
	public String getTypeNom(){
		
		return typeNom;
		
	}// FIN retTypeNom
	
	
	/** Défini le nom de la condition */
	public void setNom(String nom){
		
		this.nom = nom;
		
	}// FIN retNom
	
	
	/** Retourne le nom de la condition */
	public String getNom(){
		
		return nom;
		
	}// FIN retNom
	
	
	/** Ajoute un écouteur à la condition */
	public void ajoutEcouteur(ConditionEcouteur écouteur){
		
		écouteurs.add(écouteur);
		
	}// FIN ajoutEcouteur


	/** Retire un écouteur à la condition */
	public void retraitEcouteur(ConditionEcouteur écouteur){
		
		écouteurs.remove(écouteur);
		
	}// FIN retraitEcouteur
	
	
	/** Retourne vrai si la condition est vraie */
	public boolean isVraie(){
	
		return vraie;
		
	}// FIN retEstVraie
	
	
	/** Fait devenir la condition vraie */
	protected void vraie(){

		// Blindage
		if(vraie)
			return;
		
		// Mémorise
		vraie = true;
		
		// Prévient les écouteurs
		for(ConditionEcouteur écouteur : écouteurs)
			écouteur.devientVraie(this);
		
	}// FIN vraie
	
	
	/** Fait devenir la condition fausse */
	protected void fausse(){

		// Blindage
		if(!vraie)
			return;

		// Mémorise
		vraie = false;
		
		// Prévient les écouteurs
		for(ConditionEcouteur écouteur : écouteurs)
			écouteur.devientFausse(this);
		
	}// FIN vraie
	
	
	/** Défini le système logique auquel appartient la condition */
	public void setSystèmeLogique(SystemeLogique sl){
		
		systèmeLogique = sl;
		
	}// FIN defSystèmeLogique
	
	
	/** Retourne le système logique auquel appartient la condition */
	protected SystemeLogique getSystèmeLogique(){
		
		return systèmeLogique;
		
	}// FIN getSystèmeLogique

	
}// FIN Classe